package cn.lee.cplibrary.init;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.util.Base64;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
//绑定的项目是CPDemo
public class CPSignatureUtil {
    private static boolean isInitialized = false;

    //十六进制编码: 获取签名哈希值。这是一种将二进制数据表示为十六进制字符串的方法，每个字节用两个十六进制字符表示。
    //在控制台通过命令获取的SHA1与此一致：keytool -list -v -keystore D:\E\studio_projects\CpDemo\keystore\cpdemo.jks
    private static String getSignatureHashHex(Context context) {
        String hash = null;
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), PackageManager.GET_SIGNATURES);
            for (Signature signature : packageInfo.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                byte[] digest = md.digest();
                hash = bytesToHex(digest).toUpperCase();
            }
        } catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return hash;
    }

    //Base64 编码:获取签名哈希值。 这是一种将二进制数据转换为 ASCII 字符串的方法，常用于在网络上传输数据。
    private static String getSignatureHash(Context context) {
        String hash = null;
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), PackageManager.GET_SIGNATURES);
            for (Signature signature : packageInfo.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                hash = Base64.encodeToString(md.digest(), Base64.DEFAULT).trim();
            }
        } catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return hash;
    }
    //十六进制编码: 这是一种将二进制数据表示为十六进制字符串的方法，每个字节用两个十六进制字符表示。
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X:", b));
        }
        // Remove the trailing colon
        return sb.length() > 0 ? sb.substring(0, sb.length() - 1) : "";
    }
    //十六进制编码: 获取签名哈希值。这是一种将二进制数据表示为十六进制字符串的方法，每个字节用两个十六进制字符表示。
    //功能等同 isValidSignature
      static boolean isValidSignatureHex(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), PackageManager.GET_SIGNATURES);
            for (Signature signature : packageInfo.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                byte[] digest = md.digest();
                String currentHash = bytesToHex(digest).toUpperCase();
                // 目标应用的签名哈希值
                String TARGET_SIGNATURE_HASH = "0F:EE:98:D5:42:84:9B:78:D8:7C:1A:9C:90:DE:67:54:31:9C:F2:86";
                if (currentHash.equals(TARGET_SIGNATURE_HASH)) {
                    return true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    //十六进制编码: 获取签名哈希值。这是一种将二进制数据表示为十六进制字符串的方法，每个字节用两个十六进制字符表示。
      static boolean isValidSignature(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), PackageManager.GET_SIGNATURES);
            for (Signature signature : packageInfo.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
               String currentHash = Base64.encodeToString(md.digest(), Base64.DEFAULT).trim();
                if (currentHash.equals("D+6Y1UKEm3jYfBqckN5nVDGc8oY=")) {
                    return true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

}
